package net.lengwang.iot.middleware.network;

import java.util.Arrays;
import java.util.logging.Logger;

import net.lengwang.iot.middleware.packet.request.PacketParser;

public class TimeSyncService {

    private static final Logger logger = Logger.getLogger(TimeSyncService.class.getName());

    // 处理网关Ping请求
    public void processPingRequest(byte[] packet) {
        // 验证数据包是否是网关握手包
        if (packet.length != 11) {
            throw new IllegalArgumentException("网关握手包长度错误" + packet.length + "，packet:" + PacketParser.bytesToHex(packet));
        }

        // 验证起始标志位
        if (packet[0] != (byte)0xBE || packet[1] != (byte)0xBE) {
            throw new IllegalArgumentException("网关握手包起始标志位错误");
        }

        // 验证数据包总长度
        if (packet[2] != 0x04) {
            throw new IllegalArgumentException("网关握手包总长度错误");
        }

        // 验证命令位
        if (packet[3] != (byte)0x90) {
            throw new IllegalArgumentException("网关握手包命令位错误");
        }

        // 验证协议版本
        if (packet[4] != 0x01) {
            throw new IllegalArgumentException("网关握手包协议版本错误");
        }

        // 解析序列号
        int sequenceNumber = PacketParser.parseSequenceNumber(Arrays.copyOfRange(packet, 5, 7));
        System.out.println("接收到的网关握手包序列号: " + sequenceNumber);

        // 验证结束位
        if (packet[9] != (byte)0xEB || packet[10] != (byte)0xEB) {
            throw new IllegalArgumentException("网关握手包结束位错误");
        }
    }

    // 生成Ping响应包
    public byte[] createPingResponse(byte[] requestPacket) {
        byte[] response = new byte[11];

        // 设置起始标志位（固定为EB EB）
        response[0] = (byte) 0xEB;
        response[1] = (byte) 0xEB;

        // 设置数据包总长度
        response[2] = 0x04;

        // 设置命令位
        response[3] = (byte) 0x90;

        // 设置协议版本
        response[4] = requestPacket[4];

        // 设置序列号（与请求包相同）
        System.arraycopy(requestPacket, 5, response, 5, 2);

        // 设置CRC16（设为00 00可以屏蔽CRC16校验的功能）
        response[7] = 0x00;
        response[8] = 0x00;

        // 设置结束位（固定为BE BE）
        response[9] = (byte) 0xBE;
        response[10] = (byte) 0xBE;

        return response;
    }

    // 处理网关授时请求
    public void processTimeSyncRequest(byte[] packet) {
        if (packet.length < 21) {
            throw new IllegalArgumentException("授时请求数据包长度错误" + packet.length);
        }

        // 验证起始标志位
        if (packet[0] != (byte)0xBE || packet[1] != (byte)0xBE) {
            throw new IllegalArgumentException("授时请求包起始标志位错误");
        }

        String gatewayId = PacketParser.extractDeviceId(Arrays.copyOfRange(packet, 7, 11));
        System.out.println("接收到的网关ID: " + gatewayId);

        byte[] timeBytes = Arrays.copyOfRange(packet, 11, 17);
        String requestTime = PacketParser.bcdToTimeString(timeBytes);
        System.out.println("网关请求授时时间: " + requestTime);

        // 验证结束位
        if (packet[packet.length - 2] != (byte)0xEB || packet[packet.length - 1] != (byte)0xEB) {
            throw new IllegalArgumentException("授时请求包结束位错误");
        }
    }

    // 生成授时响应包
    public byte[] createTimeSyncResponse(byte[] requestPacket) {
        byte[] response = new byte[20];

        // 设置起始标志位（固定为EB EB）
        response[0] = (byte) 0xEB;
        response[1] = (byte) 0xEB;

        // 设置数据包总长度
        response[2] = 0x0E;

        // 设置命令位
        response[3] = (byte) 0x91;

        // 设置协议版本
        response[4] = requestPacket[4];

        System.arraycopy(requestPacket, 5, response, 5, 2);
        System.arraycopy(requestPacket, 7, response, 7, 4);

        byte[] currentTime = PacketParser.encodeBCDTime(2024, 10, 15, 16, 30, 45);
        System.arraycopy(currentTime, 0, response, 11, 6);

        response[17] = 0x00;
        response[18] = 0x00;
        // 设置结束位（固定为BE BE）
        response[19] = (byte) 0xBE;

        return response;
    }

    public void close() {
        // 实现关闭时间同步服务的逻辑
        logger.info("正在关闭时间同步服务...");
        // 添加关闭逻辑，例如停止定时任务等
    }

    public void handleTimeSync(byte[] packet) {
        // 实现处理时间同步包的逻辑
    }
}
